package register

import (
	"jlpay-sdk-go/pkg/jlpay/core"
	"jlpay-sdk-go/pkg/jlpay/models"
)

// ==================== 进件取消 ====================

// IncomingCancelRequest 进件取消请求
type IncomingCancelRequest struct {
	models.OrgBaseRequest
	// ApplyID 申请单号
	ApplyID string `json:"apply_id,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewIncomingCancelRequest 创建进件取消请求
func NewIncomingCancelRequest() *IncomingCancelRequest {
	req := &IncomingCancelRequest{}
	return req
}

// SetApplyID 设置申请单号
func (r *IncomingCancelRequest) SetApplyID(applyID string) *IncomingCancelRequest {
	r.ApplyID = applyID
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *IncomingCancelRequest) SetRawRequestMap(rawMap map[string]interface{}) *IncomingCancelRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *IncomingCancelRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *IncomingCancelRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.ApplyID != "" {
		baseMap["apply_id"] = r.ApplyID
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *IncomingCancelRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// IncomingCancelResponse 进件取消响应
type IncomingCancelResponse struct {
	models.StandardResponse
	// 进件取消响应只包含ret_code和ret_msg，没有其他字段
}

// NewIncomingCancelResponse 创建进件取消响应
func NewIncomingCancelResponse() *IncomingCancelResponse {
	return &IncomingCancelResponse{}
}

// ==================== 进件查询 ====================

// FieldDetail 字段详情
type FieldDetail struct {
	// FieldName 字段名称
	FieldName string `json:"field_name,omitempty"`
	// FieldValue 字段值
	FieldValue string `json:"field_value,omitempty"`
	// ErrorMsg 错误信息
	ErrorMsg string `json:"error_msg,omitempty"`
}

// NewFieldDetail 创建字段详情
func NewFieldDetail() *FieldDetail {
	return &FieldDetail{}
}

// ToMap 转换为map
func (f *FieldDetail) ToMap() map[string]interface{} {
	result := make(map[string]interface{})

	if f.FieldName != "" {
		result["field_name"] = f.FieldName
	}
	if f.FieldValue != "" {
		result["field_value"] = f.FieldValue
	}
	if f.ErrorMsg != "" {
		result["error_msg"] = f.ErrorMsg
	}

	return result
}

// AuditDetail 审核详情
type AuditDetail struct {
	// Module 模块变量名
	Module string `json:"module,omitempty"`
	// ModuleName 模块中文名
	ModuleName string `json:"module_name,omitempty"`
	// FailedReason 模块审核不通过原因
	FailedReason string `json:"failed_reason,omitempty"`
	// ModuleDetail 字段审核不通过原因列表
	ModuleDetail []*FieldDetail `json:"module_detail,omitempty"`
}

// NewAuditDetail 创建审核详情
func NewAuditDetail() *AuditDetail {
	return &AuditDetail{
		ModuleDetail: make([]*FieldDetail, 0),
	}
}

// ToMap 转换为map
func (a *AuditDetail) ToMap() map[string]interface{} {
	result := make(map[string]interface{})

	if a.Module != "" {
		result["module"] = a.Module
	}
	if a.ModuleName != "" {
		result["module_name"] = a.ModuleName
	}
	if a.FailedReason != "" {
		result["failed_reason"] = a.FailedReason
	}
	if a.ModuleDetail != nil && len(a.ModuleDetail) > 0 {
		moduleDetails := make([]map[string]interface{}, 0)
		for _, detail := range a.ModuleDetail {
			moduleDetails = append(moduleDetails, detail.ToMap())
		}
		result["module_detail"] = moduleDetails
	}

	return result
}

// IncomingQueryRequest 进件查询请求
type IncomingQueryRequest struct {
	models.OrgBaseRequest
	// ApplyID 申请单号
	ApplyID string `json:"apply_id,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewIncomingQueryRequest 创建进件查询请求
func NewIncomingQueryRequest() *IncomingQueryRequest {
	req := &IncomingQueryRequest{}
	return req
}

// SetApplyID 设置申请单号
func (r *IncomingQueryRequest) SetApplyID(applyID string) *IncomingQueryRequest {
	r.ApplyID = applyID
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *IncomingQueryRequest) SetRawRequestMap(rawMap map[string]interface{}) *IncomingQueryRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *IncomingQueryRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *IncomingQueryRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.ApplyID != "" {
		baseMap["apply_id"] = r.ApplyID
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *IncomingQueryRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// IncomingQueryResponse 进件查询响应
type IncomingQueryResponse struct {
	models.StandardResponse
	// ApplyID 业务申请编号
	ApplyID string `json:"apply_id,omitempty"`
	// AuditStatus 审核状态 01：审核通过, 02：审核中， 09：审核驳回
	AuditStatus string `json:"audit_status,omitempty"`
	// AuditDetail 审核驳回详情
	AuditDetail []*AuditDetail `json:"audit_detail,omitempty"`
	// AuditFailure 审核驳回描述
	AuditFailure string `json:"audit_failure,omitempty"`
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// SignID 协议编号
	SignID string `json:"sign_id,omitempty"`
	// SignStatus 签约状态 00:未签约 01:已签约 02:签约中 09:签约失败
	SignStatus string `json:"sign_status,omitempty"`
	// SignURL 协议链接
	SignURL string `json:"sign_url,omitempty"`
	// SignDelegateeID 委托合同协议编号
	SignDelegateeID string `json:"sign_delegatee_id,omitempty"`
	// SignDelegateeStatus 授权收款模式下，被授权人的签约状态
	SignDelegateeStatus string `json:"sign_delegatee_status,omitempty"`
	// SignDelegateeURL 授权收款模式下，被授权人的承诺函、电子协议签约链接
	SignDelegateeURL string `json:"sign_delegatee_url,omitempty"`
	// TermNo 终端号
	TermNo string `json:"term_no,omitempty"`
	// AuditEndTime 审核时间
	AuditEndTime string `json:"audit_end_time,omitempty"`
	// UnionpayReportRet 银联渠道报备结果 01: 成功 02: 处理中 09: 失败
	UnionpayReportRet string `json:"unionpay_report_ret,omitempty"`
	// UnionpayReportMsg 银联报备结果描述
	UnionpayReportMsg string `json:"unionpay_report_msg,omitempty"`
	// WechatReportRet 微信渠道报备结果 01: 成功 02: 处理中 09: 失败
	WechatReportRet string `json:"wechat_report_ret,omitempty"`
	// WechatReportMsg 微信报备结果描述
	WechatReportMsg string `json:"wechat_report_msg,omitempty"`
	// AlipayReportRet 支付宝渠道报备结果 01: 成功 02: 处理中 09: 失败
	AlipayReportRet string `json:"alipay_report_ret,omitempty"`
	// AlipayReportMsg 支付宝报备结果描述
	AlipayReportMsg string `json:"alipay_report_msg,omitempty"`
	// SubAppidBindRet appid绑定结果 01: 成功 02: 处理中 09: 失败
	SubAppidBindRet string `json:"sub_appid_bind_ret,omitempty"`
	// SubAppidBindMsg appid绑定结果描述
	SubAppidBindMsg string `json:"sub_appid_bind_msg,omitempty"`
	// Functions 业务开通情况
	Functions map[string]interface{} `json:"functions,omitempty"`
}

// NewIncomingQueryResponse 创建进件查询响应
func NewIncomingQueryResponse() *IncomingQueryResponse {
	return &IncomingQueryResponse{
		AuditDetail: make([]*AuditDetail, 0),
		Functions:   make(map[string]interface{}),
	}
}
